<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 说明：解决组合继承重复属性的问题，直接将子类的原型等于父类的原型，或者是用Object.create继承原型但不执行父类构造函数；
注意处理子类实例的 constructor 指向问题，new Parent2()也有这个问题； -->
    <script>
        // 补充：new与Object.create()区别
        // new创建一个对象，执行构造函数。
        // Object.create相当于创建一个对象，但是不执行构造函数。
        function Parent4() {
            this.name = 'parent4'
            this.arr = [1, 2, 3]
        }
        Parent4.prototype.say = function () {
            console.log(this.name)
        }
        function Child4() {
            Parent4.call(this)
            this.type = 'child4'
        }

        //子类的原型等于父类的原型
        Child4.prototype = Parent4.prototype
        //或 Child4.prototype = Object.create(Parent4.prototype)
        //修复重写子类原型导致子类constructor属性被修改
        Child4.prototype.constructor = Child4

        let child4_1 = new Child4()
        let child4_2 = new Child4()
        child4_1.arr.push(4)
        console.log(child4_1.arr, child4_2.arr) // [1, 2, 3, 4]  [1, 2, 3]
        console.log(child4_1.constructor === Child4) // true 
        console.log(child4_1.constructor === Parent4)// false

        // 这里的Child4就是一个继承自Function的函数对象
        console.log(Child4.constructor === Parent4) // false

    </script>
</body>

</html>